For the purpose of this report, The Bay Area has been defined as San Francisco and the 8 surrounding counties, namely Alameda, Contra Costa, Marin, Napa, San Mateo, Santa Clara, Solano, and Sonoma Counties.

Increasing post-pandemic work-from-home trends

The COVID-19 pandemic dramatically increased the acceptance of remote work and flexible work hours in the Bay Area. According to a report by WFH Research, by July of 2023, 12.7 percent of full-time workers worked fully remote, while 28.2 percent worked on a hybrid schedule. This has led to a phenomenon referred to as the “donut effect,” that describes the population shift away from city centers, creating a donut-like pattern. This trend is characterized by a decrease in population density in urban cores, particularly prominent during the COVID-19 pandemic, as remote work and changing living preferences lead individuals to relocate from city centers to surrounding suburbs or more spacious areas.

There are concerns that a city heavily dependent on tax revenues from businesses and workers in city centers may face economic difficulties due to a potential decrease in these revenues with the rise of remote work. Although the primary focus of these concerns has been on the outlook for office markets, the impact of remote work could also extend to affect upcoming development initiatives and bring about shifts in retail patterns.

library(extrafont)
library(gridtext)
library(grid)

grob_explanation <- grobTree(richtext_grob(
  "<span style='background-color:white'>There has been am obvious spike in the<br>number residents working from home<br>within the Bay Area after 2019.</span>", 
  x=.3,  y=0.3, hjust=0, gp=gpar(col = "grey30", fontsize=11), box_gp = gpar(col = "white", fill = "white"),
  padding = margin(0,0,0,0,"in")))

ggplot(wfh_value, aes(x = year, y = estimate, group = 1)) + 
#  geom_ribbon(aes(ymax = estimate + moe, ymin = estimate - moe), 
 #             fill = "navy",
  #            alpha = 0.4) + 
  geom_line(color ="#21918c") + 
  geom_point(color = "#21918c", size = 2) + 
  theme_minimal(base_size = 12) + 
    geom_vline(xintercept = "2019", linetype = "longdash", size = 0.3, color = "grey50") +
   scale_y_continuous(label = scales::comma)+
#  scale_y_continuous(labels = label_dollar(scale = .001, suffix = "k")) + 
   annotation_custom(grob_explanation)+
  labs(title = "WFH residents in the Bay Area (all 9 counties)",
       x = "Year",
       y = "ACS estimate",
       caption = "Data: US Census Bureau, ACS 5-year estimates") + theme_minimal()

Changes in Population Densities

The City of San Francisco observed decline in population density within the city since the beginning of the COVID-19 pandemic, as illustrated in the following maps. Recent research indicates a migration away from San Francisco due to changing living patterns, particularly the surge in remote work. In 2018, some of the most densely populated census tracts were withing San Francisco.

However, we can see in 2021 the distribution changed significantly, with the suburbs displaying an increase in population, while the core city witnessed a decline. In 2021, the city experienced a notable 6.3 percent decrease in population, the highest in the past decade.This analysis illustrates the donut effect in the Bay Area, with the City of San Francisco as the urban core.

# Assuming 'bay_area_2018' is your data frame and 'TotalPop' is the column for which you want quartile breaks
quartile_breaks <- quantile(bay_area_2021$TotalPop, probs = c(0, 0.25, 0.5, 0.75, 1))

# Using mapview with quartile breaks
mapview(bay_area_2021, zcol = "TotalPop", at = quartile_breaks)

Comparing Property Values

Rents in high-density areas and central business districts have also dropped since the pandemic’s onset, reflecting a shift in housing demand from crowded urban centers to more spacious suburbs. Remote work has contributed to a substantial decrease in commercial office occupancy rates and subsequent declines in commercial property prices in densely populated Bay Area tracts. The decline in property values is driven by wealthier residents leaving high-value properties, potentially leading to reduced property taxes and straining the city’s budget. Property values, as indicated by rent, are significantly higher in the suburbs of San Mateo and Santa Clara.

Takeaways for City Planners

The analysis provides compelling evidence of the donut effect taking shape in the Bay Area. The widespread adoption of remote work is revolutionizing the traditional dynamics of daily commuting to city centers, like San Francisco.

As companies increasingly embrace remote work, employees experience reduced necessity for daily commutes, potentially reshaping the established patterns of rush hour transit activity associated with bustling city centers. This shift has implications for specific transit lines, such as the T Third Street line connecting southeastern neighborhoods like Bayview-Hunters Point and Visitacion Valley to the city’s downtown area. Encouraging mixed-use developments integrating affordable housing with efficient public transportation options can mitigate the donut effect’s impact and promote sustainable urban living.

The trend towards remote work and changing residential preferences may lead to a potential loss in tax revenue as individuals relocate from urban areas, impacting the traditional tax base derived from city residents. This poses a challenge for city finances, as decreased population density within city limits could reduce property taxes and other critical local revenues. In anticipation of this shortfall, planners should proactively strategize and adopt a forward-thinking approach to budgeting.

The adoption of remote work policies by tech companies is poised to significantly alter office space utilization. Businesses may reduce office footprints in response to a remote workforce, resulting in potential office vacancies. Encouraging mixed-use development projects within downtown areas can rejuvenate city centers by creating vibrant, 24/7 communities appealing to both residents and businesses.

The consequence of these changes can influence broader aspects of urban development. There is a need for city planners to adapt and strategize ensuring a harmonious transition in the Bay Area’s urban landscape.

LS0tDQp0aXRsZTogIlRoZSBEb251dCBFZmZlY3Q6IEhvbGxvd2luZyBEb3dudG93biBpbiB0aGUgQmF5IEFyZWEiDQpzdWJ0aXRsZTogIiINCmF1dGhvcjogIlNhbXJpZGRoaSBLaGFyZSwgVW5pdmVyc2l0eSBvZiBQZW5uc3lsdmFuaWEiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBjZXJ1bGVhbiANCi0tLQ0KDQoNCipGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyByZXBvcnQsIFRoZSBCYXkgQXJlYSBoYXMgYmVlbiBkZWZpbmVkIGFzIFNhbiBGcmFuY2lzY28gYW5kIHRoZSA4IHN1cnJvdW5kaW5nIGNvdW50aWVzLCBuYW1lbHkgQWxhbWVkYSwgQ29udHJhIENvc3RhLCBNYXJpbiwgTmFwYSwgU2FuIE1hdGVvLCBTYW50YSBDbGFyYSwgU29sYW5vLCBhbmQgU29ub21hIENvdW50aWVzLioNCg0KIyMjIEluY3JlYXNpbmcgcG9zdC1wYW5kZW1pYyB3b3JrLWZyb20taG9tZSB0cmVuZHMNCg0KDQo8aW1nIHNyYz0iLi9pbWFnZXMvc25henp5LWltYWdlLnBuZyIgd2lkdGg9IjMwMCIgYWxpZ249InJpZ2h0IiBzdHlsZT0iZGlzcGxheTogaW5saW5lOyBtYXJnaW46IDAgMTBweDsiLz4NCg0KDQpUaGUgQ09WSUQtMTkgcGFuZGVtaWMgZHJhbWF0aWNhbGx5IGluY3JlYXNlZCB0aGUgYWNjZXB0YW5jZSBvZiByZW1vdGUgd29yayBhbmQgZmxleGlibGUgd29yayBob3VycyBpbiB0aGUgQmF5IEFyZWEuIEFjY29yZGluZyB0byBhIHJlcG9ydCBieSBbV0ZIIFJlc2VhcmNoLF0oaHR0cHM6Ly93ZmhyZXNlYXJjaC5jb20vKSBieSBKdWx5IG9mIDIwMjMsIDEyLjcgcGVyY2VudCBvZiBmdWxsLXRpbWUgd29ya2VycyB3b3JrZWQgZnVsbHkgcmVtb3RlLCB3aGlsZSAyOC4yIHBlcmNlbnQgd29ya2VkIG9uIGEgaHlicmlkIHNjaGVkdWxlLiBUaGlzIGhhcyBsZWQgdG8gYSBwaGVub21lbm9uIHJlZmVycmVkIHRvIGFzIHRoZSAiZG9udXQgZWZmZWN0LCIgdGhhdCBkZXNjcmliZXMgdGhlIHBvcHVsYXRpb24gc2hpZnQgYXdheSBmcm9tIGNpdHkgY2VudGVycywgY3JlYXRpbmcgYSBkb251dC1saWtlIHBhdHRlcm4uIFRoaXMgdHJlbmQgaXMgY2hhcmFjdGVyaXplZCBieSBhIGRlY3JlYXNlIGluIHBvcHVsYXRpb24gZGVuc2l0eSBpbiB1cmJhbiBjb3JlcywgcGFydGljdWxhcmx5IHByb21pbmVudCBkdXJpbmcgdGhlIENPVklELTE5IHBhbmRlbWljLCBhcyByZW1vdGUgd29yayBhbmQgY2hhbmdpbmcgbGl2aW5nIHByZWZlcmVuY2VzIGxlYWQgaW5kaXZpZHVhbHMgdG8gcmVsb2NhdGUgZnJvbSBjaXR5IGNlbnRlcnMgdG8gc3Vycm91bmRpbmcgc3VidXJicyBvciBtb3JlIHNwYWNpb3VzIGFyZWFzLiANCiANClRoZXJlIGFyZSBjb25jZXJucyB0aGF0IGEgY2l0eSBoZWF2aWx5IGRlcGVuZGVudCBvbiB0YXggcmV2ZW51ZXMgZnJvbSBidXNpbmVzc2VzIGFuZCB3b3JrZXJzIGluIGNpdHkgY2VudGVycyBtYXkgZmFjZSBlY29ub21pYyBkaWZmaWN1bHRpZXMgZHVlIHRvIGEgcG90ZW50aWFsIGRlY3JlYXNlIGluIHRoZXNlIHJldmVudWVzIHdpdGggdGhlIHJpc2Ugb2YgcmVtb3RlIHdvcmsuIEFsdGhvdWdoIHRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoZXNlIGNvbmNlcm5zIGhhcyBiZWVuIG9uIHRoZSBvdXRsb29rIGZvciBvZmZpY2UgbWFya2V0cywgdGhlIGltcGFjdCBvZiByZW1vdGUgd29yayBjb3VsZCBhbHNvIGV4dGVuZCB0byBhZmZlY3QgdXBjb21pbmcgZGV2ZWxvcG1lbnQgaW5pdGlhdGl2ZXMgYW5kIGJyaW5nIGFib3V0IHNoaWZ0cyBpbiByZXRhaWwgcGF0dGVybnMuDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KICBrbml0cjo6b3B0c19jaHVuayRzZXQoDQogICAgZWNobyA9IFRSVUUsDQogICAgd2FybmluZyA9IEZBTFNFLA0KICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICBvdXQud2lkdGggPSAnMTAwJScsDQogICAgZmlnLnJldGluYSA9Mw0KICApDQpgYGANCg0KYGBge3IgcGFja2FnZXMsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeWNlbnN1cykNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShtYXB2aWV3KQ0KbGlicmFyeSh0aWdyaXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ2JlZXN3YXJtKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGdnaXJhcGgpDQpsaWJyYXJ5KHBsb3RseSkNCmBgYA0KDQpgYGB7ciBhY3MgbGlzdCwgaW5jbHVkZT1GQUxTRX0NCmFjc192YXJpYWJsZV9saXN0LjIwMjAgPC0gbG9hZF92YXJpYWJsZXMoMjAyMCwgI3llYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjczUiLCAjZml2ZSB5ZWFyIEFDUyBlc3RpbWF0ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBUUlVFKQ0KDQphY3NfdmFyaWFibGVfbGlzdC4yMDE2IDwtIGxvYWRfdmFyaWFibGVzKDIwMTYsICN5ZWFyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3M1IiwgI2ZpdmUgeWVhciBBQ1MgZXN0aW1hdGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gVFJVRSkNCmBgYA0KDQpgYGB7ciB0aGVtZSwgaW5jbHVkZT1GQUxTRX0NCg0KdGhlbWVfc2sgPC0gZnVuY3Rpb24oYmFzZV9zaXplID0gMTIsIHRpdGxlX3NpemUgPSAxNikgew0KICBmb250IDwtICJzYW5zIg0KICANCiAgIyBDcmVhdGUgYSBiYXNlIHRoZW1lDQogIGJhc2VfdGhlbWUgPC0gdGhlbWVfbWluaW1hbCgpICsNCiAgICB0aGVtZSgNCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBzaXplID0gMTIpLA0KICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBzaXplID0gdGl0bGVfc2l6ZSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgI3BhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiZ3JleTgwIiwgZmlsbCA9IE5BLCBzaXplID0gMSksDQogICAgICNwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIGNvbG9yID0gImJsYWNrIiksDQogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSAxMiksDQogICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTgwIiwgY29sb3IgPSAid2hpdGUiKSwNCiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBzaXplID0gMTApLA0KICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIGhqdXN0ID0gMSksDQogICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5ODAiLCBsaW5ldHlwZSA9ICJsb25nZGFzaCIsIHNpemUgPSAwLjEpLA0KICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBjb2xvciA9ICJncmV5NTAiKSwNCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkNCiAgICApDQogIA0KfQ0KYGBgDQoNCmBgYHtyIHdmaCBkYXRhLCBpbmNsdWRlPUZBTFNFfQ0KYmF5ID0gYygiU2FuIEZyYW5jaXNjbyIsICJBbGFtZWRhIiwgIkNvbnRyYSBDb3N0YSIsICJNYXJpbiIsICJOYXBhIiwgIlNhbiBNYXRlbyIsICJTYW50YSBDbGFyYSIsICJTb2xhbm8iLCAiU29ub21hIikNCg0KeWVhcnMgPC0gMjAwOToyMDIxDQpuYW1lcyh5ZWFycykgPC0geWVhcnMNCg0Kd2ZoX3ZhbHVlIDwtIG1hcF9kZnIoeWVhcnMsIH57DQogIGdldF9hY3MoDQogICAgZ2VvZ3JhcGh5ID0gImNvdW50eSIsDQogICAgdmFyaWFibGVzID0gIkI5OTA4N18wMDUiLA0KICAgIHN0YXRlID0gIkNBIiwNCiAgICBjb3VudHkgPSBiYXksDQogICAgeWVhciA9IC54LA0KICAgIHN1cnZleSA9ICJhY3M1Ig0KICApDQp9LCAuaWQgPSAieWVhciIpJT4lDQogIGdyb3VwX2J5KHllYXIpJT4lDQogIHN1bW1hcmlzZShlc3RpbWF0ZSA9IHN1bShlc3RpbWF0ZSkpICMsIG1vZSA9IG1heChtb2UpKQ0KYGBgDQoNCmBgYHtyIGdyYXBoIG9mIFdGSCwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OH0NCmxpYnJhcnkoZXh0cmFmb250KQ0KbGlicmFyeShncmlkdGV4dCkNCmxpYnJhcnkoZ3JpZCkNCg0KZ3JvYl9leHBsYW5hdGlvbiA8LSBncm9iVHJlZShyaWNodGV4dF9ncm9iKA0KICAiPHNwYW4gc3R5bGU9J2JhY2tncm91bmQtY29sb3I6d2hpdGUnPlRoZXJlIGhhcyBiZWVuIGFtIG9idmlvdXMgc3Bpa2UgaW4gdGhlPGJyPm51bWJlciByZXNpZGVudHMgd29ya2luZyBmcm9tIGhvbWU8YnI+d2l0aGluIHRoZSBCYXkgQXJlYSBhZnRlciAyMDE5Ljwvc3Bhbj4iLCANCiAgeD0uMywgIHk9MC4zLCBoanVzdD0wLCBncD1ncGFyKGNvbCA9ICJncmV5MzAiLCBmb250c2l6ZT0xMSksIGJveF9ncCA9IGdwYXIoY29sID0gIndoaXRlIiwgZmlsbCA9ICJ3aGl0ZSIpLA0KICBwYWRkaW5nID0gbWFyZ2luKDAsMCwwLDAsImluIikpKQ0KDQpnZ3Bsb3Qod2ZoX3ZhbHVlLCBhZXMoeCA9IHllYXIsIHkgPSBlc3RpbWF0ZSwgZ3JvdXAgPSAxKSkgKyANCiMgIGdlb21fcmliYm9uKGFlcyh5bWF4ID0gZXN0aW1hdGUgKyBtb2UsIHltaW4gPSBlc3RpbWF0ZSAtIG1vZSksIA0KICMgICAgICAgICAgICAgZmlsbCA9ICJuYXZ5IiwNCiAgIyAgICAgICAgICAgIGFscGhhID0gMC40KSArIA0KICBnZW9tX2xpbmUoY29sb3IgPSIjMjE5MThjIikgKyANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjMjE5MThjIiwgc2l6ZSA9IDIpICsgDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsgDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIjIwMTkiLCBsaW5ldHlwZSA9ICJsb25nZGFzaCIsIHNpemUgPSAwLjMsIGNvbG9yID0gImdyZXk1MCIpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6Y29tbWEpKw0KIyAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGxhYmVsX2RvbGxhcihzY2FsZSA9IC4wMDEsIHN1ZmZpeCA9ICJrIikpICsgDQogICBhbm5vdGF0aW9uX2N1c3RvbShncm9iX2V4cGxhbmF0aW9uKSsNCiAgbGFicyh0aXRsZSA9ICJXRkggcmVzaWRlbnRzIGluIHRoZSBCYXkgQXJlYSAoYWxsIDkgY291bnRpZXMpIiwNCiAgICAgICB4ID0gIlllYXIiLA0KICAgICAgIHkgPSAiQUNTIGVzdGltYXRlIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGE6IFVTIENlbnN1cyBCdXJlYXUsIEFDUyA1LXllYXIgZXN0aW1hdGVzIikgKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMgQ2hhbmdlcyBpbiBQb3B1bGF0aW9uIERlbnNpdGllcyANCg0KVGhlIENpdHkgb2YgU2FuIEZyYW5jaXNjbyBvYnNlcnZlZCBkZWNsaW5lIGluIHBvcHVsYXRpb24gZGVuc2l0eSB3aXRoaW4gdGhlIGNpdHkgc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIGFzIGlsbHVzdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgbWFwcy4gUmVjZW50IHJlc2VhcmNoIGluZGljYXRlcyBhIG1pZ3JhdGlvbiBhd2F5IGZyb20gU2FuIEZyYW5jaXNjbyBkdWUgdG8gY2hhbmdpbmcgbGl2aW5nIHBhdHRlcm5zLCBwYXJ0aWN1bGFybHkgdGhlIHN1cmdlIGluIHJlbW90ZSB3b3JrLiBJbiAyMDE4LCBzb21lIG9mIHRoZSBtb3N0IGRlbnNlbHkgcG9wdWxhdGVkIGNlbnN1cyB0cmFjdHMgd2VyZSB3aXRoaW5nIFNhbiBGcmFuY2lzY28uIA0KDQpgYGB7ciBkYXRhIGZvciBpbnQgbWFwMSwgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCmJheV9hcmVhXzIwMTggPC0gZ2V0X2FjcygNCiAgZ2VvZ3JhcGh5ID0gInRyYWN0IiwNCiAgdmFyaWFibGVzID0gIkIwMTAwMV8wMDEiLCAjcG9wdWxhdGlvbg0KICB5ZWFyID0gMjAxOCwNCiAgc3RhdGUgPSAiQ0EiLA0KICBjb3VudHkgPSBiYXkgLA0KICBnZW9tZXRyeSA9IFRSVUUNCiklPiUNCiAgcmVuYW1lKFRvdGFsUG9wID0gZXN0aW1hdGUpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQojIEFzc3VtaW5nICdiYXlfYXJlYV8yMDE4JyBpcyB5b3VyIGRhdGEgZnJhbWUgYW5kICdUb3RhbFBvcCcgaXMgdGhlIGNvbHVtbiBmb3Igd2hpY2ggeW91IHdhbnQgcXVhcnRpbGUgYnJlYWtzDQpxdWFydGlsZV9icmVha3MgPC0gcXVhbnRpbGUoYmF5X2FyZWFfMjAxOCRUb3RhbFBvcCwgcHJvYnMgPSBjKDAsIDAuMjUsIDAuNSwgMC43NSwgMSkpDQoNCiMgVXNpbmcgbWFwdmlldyB3aXRoIHF1YXJ0aWxlIGJyZWFrcw0KbWFwdmlldyhiYXlfYXJlYV8yMDE4LCB6Y29sID0gIlRvdGFsUG9wIiwgYXQgPSBxdWFydGlsZV9icmVha3MpDQoNCiNpbnRlcnZhbHMgPC0gYygwLCAzNzUwLCA3NTAwLCAxMTI1MCwgMTUwMDApDQoNCiMgVXNpbmcgbWFwdmlldyB3aXRoIGVxdWFsIGludGVydmFscw0KI21hcHZpZXcoYmF5X2FyZWFfMjAxOCwgemNvbCA9ICJUb3RhbFBvcCIsIGF0ID0gaW50ZXJ2YWxzKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGludG1hcDEsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpjb2xzID0gYygnI2NhMDAyMCcsJyNmNGE1ODInLCcjOTJjNWRlJywnIzA1NzFiMCcpDQoNCm1hcHZpZXcoYmF5X2FyZWFfMjAxOCwgemNvbCA9ICJUb3RhbFBvcCIpDQpgYGANCg0KSG93ZXZlciwgd2UgY2FuIHNlZSBpbiAyMDIxIHRoZSBkaXN0cmlidXRpb24gY2hhbmdlZCBzaWduaWZpY2FudGx5LCB3aXRoIHRoZSBzdWJ1cmJzIGRpc3BsYXlpbmcgYW4gaW5jcmVhc2UgaW4gcG9wdWxhdGlvbiwgd2hpbGUgdGhlIGNvcmUgY2l0eSB3aXRuZXNzZWQgYSBkZWNsaW5lLiBJbiAyMDIxLCB0aGUgY2l0eSBleHBlcmllbmNlZCBhIG5vdGFibGUgNi4zIHBlcmNlbnQgZGVjcmVhc2UgaW4gcG9wdWxhdGlvbiwgdGhlIGhpZ2hlc3QgaW4gdGhlIHBhc3QgZGVjYWRlLlRoaXMgYW5hbHlzaXMgaWxsdXN0cmF0ZXMgdGhlIGRvbnV0IGVmZmVjdCBpbiB0aGUgQmF5IEFyZWEsIHdpdGggdGhlIENpdHkgb2YgU2FuIEZyYW5jaXNjbyBhcyB0aGUgdXJiYW4gY29yZS4gIA0KDQpgYGB7ciBkYXRhIGZvciBpbnQgbWFwMiwgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQoNCmJheV9hcmVhXzIwMjEgPC0gZ2V0X2FjcygNCiAgZ2VvZ3JhcGh5ID0gInRyYWN0IiwNCiAgdmFyaWFibGVzID0gIkIwMTAwMV8wMDEiLCAjcG9wdWxhdGlvbg0KICB5ZWFyID0gMjAyMSwNCiAgc3RhdGUgPSAiQ0EiLA0KICBjb3VudHkgPSBiYXkgLA0KICBnZW9tZXRyeSA9IFRSVUUNCiklPiUNCiAgcmVuYW1lKFRvdGFsUG9wID0gZXN0aW1hdGUpDQoNCmBgYA0KDQpgYGB7ciBpbnRtYXAyLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaW50ZXJ2YWxzIDwtIGMoMCwgMzc1MCwgNzUwMCwgMTEyNTAsIDE1MDAwKQ0KDQptYXB2aWV3KGJheV9hcmVhXzIwMjEsIHpjb2wgPSAiVG90YWxQb3AiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBc3N1bWluZyAnYmF5X2FyZWFfMjAxOCcgaXMgeW91ciBkYXRhIGZyYW1lIGFuZCAnVG90YWxQb3AnIGlzIHRoZSBjb2x1bW4gZm9yIHdoaWNoIHlvdSB3YW50IHF1YXJ0aWxlIGJyZWFrcw0KcXVhcnRpbGVfYnJlYWtzIDwtIHF1YW50aWxlKGJheV9hcmVhXzIwMjEkVG90YWxQb3AsIHByb2JzID0gYygwLCAwLjI1LCAwLjUsIDAuNzUsIDEpKQ0KDQojIFVzaW5nIG1hcHZpZXcgd2l0aCBxdWFydGlsZSBicmVha3MNCm1hcHZpZXcoYmF5X2FyZWFfMjAyMSwgemNvbCA9ICJUb3RhbFBvcCIsIGF0ID0gcXVhcnRpbGVfYnJlYWtzKQ0KYGBgDQoNCg0KDQojIyMgQ29tcGFyaW5nIFByb3BlcnR5IFZhbHVlcw0KDQpSZW50cyBpbiBoaWdoLWRlbnNpdHkgYXJlYXMgYW5kIGNlbnRyYWwgYnVzaW5lc3MgZGlzdHJpY3RzIGhhdmUgYWxzbyBkcm9wcGVkIHNpbmNlIHRoZSBwYW5kZW1pYydzIG9uc2V0LCByZWZsZWN0aW5nIGEgc2hpZnQgaW4gaG91c2luZyBkZW1hbmQgZnJvbSBjcm93ZGVkIHVyYmFuIGNlbnRlcnMgdG8gbW9yZSBzcGFjaW91cyBzdWJ1cmJzLiBSZW1vdGUgd29yayBoYXMgY29udHJpYnV0ZWQgdG8gYSBzdWJzdGFudGlhbCBkZWNyZWFzZSBpbiBjb21tZXJjaWFsIG9mZmljZSBvY2N1cGFuY3kgcmF0ZXMgYW5kIHN1YnNlcXVlbnQgZGVjbGluZXMgaW4gY29tbWVyY2lhbCBwcm9wZXJ0eSBwcmljZXMgaW4gZGVuc2VseSBwb3B1bGF0ZWQgQmF5IEFyZWEgdHJhY3RzLiBUaGUgZGVjbGluZSBpbiBwcm9wZXJ0eSB2YWx1ZXMgaXMgZHJpdmVuIGJ5IHdlYWx0aGllciByZXNpZGVudHMgbGVhdmluZyBoaWdoLXZhbHVlIHByb3BlcnRpZXMsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gcmVkdWNlZCBwcm9wZXJ0eSB0YXhlcyBhbmQgc3RyYWluaW5nIHRoZSBjaXR5J3MgYnVkZ2V0LiBQcm9wZXJ0eSB2YWx1ZXMsIGFzIGluZGljYXRlZCBieSByZW50LCBhcmUgc2lnbmlmaWNhbnRseSBoaWdoZXIgaW4gdGhlIHN1YnVyYnMgb2YgU2FuIE1hdGVvIGFuZCBTYW50YSBDbGFyYS4NCg0KYGBge3IgY2hhcnRubWFwIGRhdGEsIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KdnRfaW5jb21lIDwtIGdldF9hY3MoDQogIGdlb2dyYXBoeSA9ICJjb3VudHkiLA0KICB2YXJpYWJsZXMgPSAiQjI1MDU4XzAwMUUiLA0KICBzdGF0ZSA9ICJDQSIsDQogIGNvdW50eSA9IGJheSwNCiAgeWVhciA9IDIwMjAsDQogIGdlb21ldHJ5ID0gVFJVRQ0KKSAlPiUNCiAgbXV0YXRlKE5BTUUgPSBzdHJfcmVtb3ZlKE5BTUUsICIgQ291bnR5LCBDYWxpZm9ybmlhIikpDQoNCg0KIyBDaG9yb3BsZXRoIG1hcA0KdnRfbWFwIDwtIGdncGxvdCh2dF9pbmNvbWUsIGFlcyhmaWxsID0gZXN0aW1hdGUpKSArIA0KICBnZW9tX3NmX2ludGVyYWN0aXZlKGFlcyhkYXRhX2lkID0gR0VPSUQpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpICsgICMgVXNlIHZpcmlkaXMgcGFsZXR0ZQ0KICB0aGVtZV92b2lkKCkrDQogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSANCg0KIyBTY2F0dGVyIHBsb3Qgd2l0aCBlcnJvciBiYXJzDQp2dF9wbG90IDwtIA0KICBnZ3Bsb3QodnRfaW5jb21lLCBhZXMoeCA9IGVzdGltYXRlLCB5ID0gcmVvcmRlcihOQU1FLCBlc3RpbWF0ZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGVzdGltYXRlKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluID0gZXN0aW1hdGUgLSBtb2UsIHhtYXggPSBlc3RpbWF0ZSArIG1vZSkpICsNCiAgZ2VvbV9wb2ludF9pbnRlcmFjdGl2ZShjb2xvciA9ICJibGFjayIsIHNpemUgPSA0LCBzaGFwZSA9IDIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyhkYXRhX2lkID0gR0VPSUQpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkgKyAgIyBVc2UgdmlyaWRpcyBwYWxldHRlDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcl9mb3JtYXQoKSkgKyANCiAgbGFicyh0aXRsZSA9ICJNZWRpYW4gUmVudCBieSBjb3VudHkgaW4gdGhlIEJheSBBcmVhIiwNCiAgICAgICBzdWJ0aXRsZSA9ICIyMDIwIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkiLA0KICAgICAgIHkgPSAiIiwNCiAgICAgICB4ID0gIk1lZGlhbiBSZW50IChiYXJzIHJlcHJlc2VudCBtYXJnaW4gb2YgZXJyb3IpIiwNCiAgICAgICBmaWxsID0gIk1lZGlhbiBSZW50IikgKyANCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkNCg0KYGBgDQoNCmBgYHtyIGNoYXJ0bm1hcCwgZWNobz1GQUxTRX0NCg0KIyBDb21iaW5lIHRoZSBtYXBzDQoNCmdpcmFmZShnZ29iaiA9IHZ0X21hcCArIHZ0X3Bsb3QsIHdpZHRoX3N2ZyA9IDEyLCBoZWlnaHRfc3ZnID0gNSkgJT4lDQogIGdpcmFmZV9vcHRpb25zKG9wdHNfaG92ZXIoY3NzID0gImZpbGw6Y3lhbjsiKSkNCmBgYA0KDQojIyMgVGFrZWF3YXlzIGZvciBDaXR5IFBsYW5uZXJzDQoNClRoZSBhbmFseXNpcyBwcm92aWRlcyBjb21wZWxsaW5nIGV2aWRlbmNlIG9mIHRoZSBkb251dCBlZmZlY3QgdGFraW5nIHNoYXBlIGluIHRoZSBCYXkgQXJlYS4gVGhlIHdpZGVzcHJlYWQgYWRvcHRpb24gb2YgcmVtb3RlIHdvcmsgaXMgcmV2b2x1dGlvbml6aW5nIHRoZSB0cmFkaXRpb25hbCBkeW5hbWljcyBvZiBkYWlseSBjb21tdXRpbmcgdG8gY2l0eSBjZW50ZXJzLCBsaWtlIFNhbiBGcmFuY2lzY28uDQoNCkFzIGNvbXBhbmllcyBpbmNyZWFzaW5nbHkgZW1icmFjZSByZW1vdGUgd29yaywgZW1wbG95ZWVzIGV4cGVyaWVuY2UgcmVkdWNlZCBuZWNlc3NpdHkgZm9yIGRhaWx5IGNvbW11dGVzLCBwb3RlbnRpYWxseSByZXNoYXBpbmcgdGhlIGVzdGFibGlzaGVkIHBhdHRlcm5zIG9mIHJ1c2ggaG91ciB0cmFuc2l0IGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCBidXN0bGluZyBjaXR5IGNlbnRlcnMuIFRoaXMgc2hpZnQgaGFzIGltcGxpY2F0aW9ucyBmb3Igc3BlY2lmaWMgdHJhbnNpdCBsaW5lcywgc3VjaCBhcyB0aGUgVCBUaGlyZCBTdHJlZXQgbGluZSBjb25uZWN0aW5nIHNvdXRoZWFzdGVybiBuZWlnaGJvcmhvb2RzIGxpa2UgQmF5dmlldy1IdW50ZXJzIFBvaW50IGFuZCBWaXNpdGFjaW9uIFZhbGxleSB0byB0aGUgY2l0eSdzIGRvd250b3duIGFyZWEuIEVuY291cmFnaW5nIG1peGVkLXVzZSBkZXZlbG9wbWVudHMgaW50ZWdyYXRpbmcgYWZmb3JkYWJsZSBob3VzaW5nIHdpdGggZWZmaWNpZW50IHB1YmxpYyB0cmFuc3BvcnRhdGlvbiBvcHRpb25zIGNhbiBtaXRpZ2F0ZSB0aGUgZG9udXQgZWZmZWN0J3MgaW1wYWN0IGFuZCBwcm9tb3RlIHN1c3RhaW5hYmxlIHVyYmFuIGxpdmluZy4NCg0KVGhlIHRyZW5kIHRvd2FyZHMgcmVtb3RlIHdvcmsgYW5kIGNoYW5naW5nIHJlc2lkZW50aWFsIHByZWZlcmVuY2VzIG1heSBsZWFkIHRvIGEgcG90ZW50aWFsIGxvc3MgaW4gdGF4IHJldmVudWUgYXMgaW5kaXZpZHVhbHMgcmVsb2NhdGUgZnJvbSB1cmJhbiBhcmVhcywgaW1wYWN0aW5nIHRoZSB0cmFkaXRpb25hbCB0YXggYmFzZSBkZXJpdmVkIGZyb20gY2l0eSByZXNpZGVudHMuIFRoaXMgcG9zZXMgYSBjaGFsbGVuZ2UgZm9yIGNpdHkgZmluYW5jZXMsIGFzIGRlY3JlYXNlZCBwb3B1bGF0aW9uIGRlbnNpdHkgd2l0aGluIGNpdHkgbGltaXRzIGNvdWxkIHJlZHVjZSBwcm9wZXJ0eSB0YXhlcyBhbmQgb3RoZXIgY3JpdGljYWwgbG9jYWwgcmV2ZW51ZXMuIEluIGFudGljaXBhdGlvbiBvZiB0aGlzIHNob3J0ZmFsbCwgcGxhbm5lcnMgc2hvdWxkIHByb2FjdGl2ZWx5IHN0cmF0ZWdpemUgYW5kIGFkb3B0IGEgZm9yd2FyZC10aGlua2luZyBhcHByb2FjaCB0byBidWRnZXRpbmcuDQoNClRoZSBhZG9wdGlvbiBvZiByZW1vdGUgd29yayBwb2xpY2llcyBieSB0ZWNoIGNvbXBhbmllcyBpcyBwb2lzZWQgdG8gc2lnbmlmaWNhbnRseSBhbHRlciBvZmZpY2Ugc3BhY2UgdXRpbGl6YXRpb24uIEJ1c2luZXNzZXMgbWF5IHJlZHVjZSBvZmZpY2UgZm9vdHByaW50cyBpbiByZXNwb25zZSB0byBhIHJlbW90ZSB3b3JrZm9yY2UsIHJlc3VsdGluZyBpbiBwb3RlbnRpYWwgb2ZmaWNlIHZhY2FuY2llcy4gRW5jb3VyYWdpbmcgbWl4ZWQtdXNlIGRldmVsb3BtZW50IHByb2plY3RzIHdpdGhpbiBkb3dudG93biBhcmVhcyBjYW4gcmVqdXZlbmF0ZSBjaXR5IGNlbnRlcnMgYnkgY3JlYXRpbmcgdmlicmFudCwgMjQvNyBjb21tdW5pdGllcyBhcHBlYWxpbmcgdG8gYm90aCByZXNpZGVudHMgYW5kIGJ1c2luZXNzZXMuDQoNClRoZSBjb25zZXF1ZW5jZSBvZiB0aGVzZSBjaGFuZ2VzIGNhbiBpbmZsdWVuY2UgYnJvYWRlciBhc3BlY3RzIG9mIHVyYmFuIGRldmVsb3BtZW50LiBUaGVyZSBpcyBhIG5lZWQgZm9yIGNpdHkgcGxhbm5lcnMgdG8gYWRhcHQgYW5kIHN0cmF0ZWdpemUgZW5zdXJpbmcgYSBoYXJtb25pb3VzIHRyYW5zaXRpb24gaW4gdGhlIEJheSBBcmVhJ3MgdXJiYW4gbGFuZHNjYXBlLiANCg0K